/*
 * Copyright (c) 2005 Chris Richardson
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package net.chrisrichardson.ormunit.hibernate;

import junit.framework.Assert;

import org.hibernate.engine.CascadeStyle;
import org.hibernate.mapping.KeyValue;
import org.hibernate.mapping.OneToMany;
import org.hibernate.mapping.Property;
import org.hibernate.mapping.SimpleValue;
import org.hibernate.mapping.Value;

public class ListPropertyMapping extends FieldMapping {

	private final org.hibernate.mapping.List value;

	public ListPropertyMapping(Property property, org.hibernate.mapping.List value) {
		super(property);
		this.value = value;
	}

	public ListPropertyMapping assertForeignKey(String foreignKeyColumnName) {
		KeyValue keyValue = value.getKey();
		HibernateAssertUtil.assertColumn(foreignKeyColumnName, keyValue);
		return this;
	}

	public ListPropertyMapping assertIndexColumn(String indexColumnName) {
		Value indexValue = value.getIndex();
		HibernateAssertUtil.assertColumn(indexColumnName, indexValue);
		return this;
	}

	public ListPropertyMapping assertTable(String tableName) {
		Assert.assertEquals(tableName, value.getElement().getTable().getName());
		return this;
	}

	public ListPropertyMapping assertElementClass(Class type) {
		Value rawElement = value.getElement();
		if (rawElement instanceof SimpleValue) {
			SimpleValue sve = (SimpleValue) rawElement;
			Assert.assertEquals(type.getName(), sve.getTypeName());
		} else {
			Assert.assertTrue("Expected one to many mapping but got "
					+ rawElement, rawElement instanceof OneToMany);
			OneToMany element = (OneToMany) rawElement;
			Assert.assertEquals(type.getName(), element.getAssociatedClass()
					.getClassName());
		}
		return this;
	}

	public ListPropertyMapping cascade(CascadeStyle cascade) {
		assertCascade(cascade);
		return this;
	}
}
